﻿#ifndef __GRAPH_OTHER_SCENES_H__
#define __GRAPH_OTHER_SCENES_H__

/* Includes: */
#include "GraphAbstract.h"

/**
    \brief Класс, описывающий слой для сцены главного меню игры.
 */
class GrMainMenuLayer : public CCLayer
{
public:
    GrMainMenuLayer();
    ~GrMainMenuLayer();

    /** \brief Коллбэк функция для выбора элемента главного меню. */
    void menuCallback( CCObject* pSender );
    
    /** \brief Коллбэк функция для выбора элемента меню выхода из игры. */
    void exitCallback( CCObject* pSender );

    /** Реализуем статический метод "static node()" вручную. */
    LAYER_NODE_FUNC( GrMainMenuLayer );
};

/**
    \brief Класс, описывающий слой для сцены заставки игры.
 */
class GrSplashScreenLayer : public CCLayer
{
public:
    GrSplashScreenLayer();
    ~GrSplashScreenLayer();

    /** Реализуем статический метод "static node()" вручную. */
    LAYER_NODE_FUNC( GrSplashScreenLayer );

protected:
    /** Коллбэк функция отработки события таймера, для отображения заставки. */
    void _timerCallback( ccTime );
};

/**
    \brief Класс, описывающий слой для сцены процесса загрузки игры.
 */
class GrLoadingScreenLayer : public CCLayer
{
public:
    GrLoadingScreenLayer();
    ~GrLoadingScreenLayer();

    /** Реализуем статический метод "static node()" вручную. */
    LAYER_NODE_FUNC( GrLoadingScreenLayer );

protected:
    /** Коллбэк функция отработки события таймера, для имитации процесса загрузки игры. */
    void _timerCallback( ccTime );
};

/**
    \brief Сцена для отображения процесса загрузки игры.
 */
class GrLoadingScreenScene : public GrSceneAbstract
{
    /** \brief Переопределение функции запуска сцены. */
    virtual void runScene();
};

/**
    \brief Класс, описывающий слой для сцены со списком рекордов игры.
 */
class GrRecordsScreenLayer : public CCLayer
{
public:
    GrRecordsScreenLayer();
    ~GrRecordsScreenLayer();

    /** Реализуем статический метод "static node()" вручную. */
    LAYER_NODE_FUNC( GrRecordsScreenLayer );
};

/**
    \brief Сцена для отображения списка рекордов игры.
 */
class GrRecordsScreenScene : public GrSceneAbstract
{
public:
    GrRecordsScreenScene( bool showMenuBtn = false );

    /** \brief Переопределение функции запуска сцены. */
    virtual void runScene();
};

/** Максимальное количество элементов меню настроек программы. */
#define SETTINGS_MENU_ITEMS_COUNT 2

/**
    \brief Класс, описывающий слой для сцены с настройками игры.
 */
class GrSettingsScreenLayer : public CCLayer
{
public:
    GrSettingsScreenLayer();
    ~GrSettingsScreenLayer();

    /** Реализуем статический метод "static node()" вручную. */
    LAYER_NODE_FUNC( GrSettingsScreenLayer );

protected:
    /** \brief Колбэк функция для изменения настройки игры. */
    void itemSelectCallback( CCObject* pSender );

    char    p_settingVal[SETTINGS_MENU_ITEMS_COUNT];  //!< Массив из значений  элементов .
};

/**
    \brief Сцена для отображения окна с настройками игры.
 */
class GrSettingsScreenScene : public GrSceneAbstract
{
public:
    GrSettingsScreenScene( bool showMenuBtn = false );

    /** \brief Переопределение функции запуска сцены. */
    virtual void runScene();
};

#endif /* __GRAPH_OTHER_SCENES_H__ */
